0ff9adb79042b050108f2ddde41e93d445312b7e,platform/lang-impl/src/com/intellij/codeInsight/navigation/CtrlMouseHandler.java,TooltipProvider,execute,#BrowseMode#,445

Before Change



      if (offset >= selStart && offset < selEnd) return;

      ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
        public void run() {
          ApplicationManager.getApplication().runReadAction(new Runnable() {
            public void run() {
              doExecute(file, offset);
            }
          });
        }
      });
    }

    private void doExecute(PsiFile file, int offset) {

After Change



      if (offset >= selStart && offset < selEnd) return;

      ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
        public void run() {
          final ProgressIndicator progressIndicator = new ProgressIndicatorBase();
          final ApplicationAdapter listener = new ApplicationAdapter() {
            @Override
            public void beforeWriteActionStart(Object action) {
              progressIndicator.cancel();
            }
          };
          final Application application = ApplicationManager.getApplication();
          try {
            application.addApplicationListener(listener);
            ProgressManager.getInstance().runProcess(new Runnable(){
                @Override
                public void run() {
                  // This read action can possibe last for a long time, we want it to stop immediately on the first write access.
                  // For this purpose we launch it under empty progress and invoke progressIndicator#cancel on write access to avoid possible write lock delays.
                  application.runReadAction(new Runnable() {
                    public void run() {
                      doExecute(file, offset);
                    }
                  });
                }
              }, progressIndicator);
          }
          finally {
            application.removeApplicationListener(listener);
          }
        }
      });
    }

    private void doExecute(PsiFile file, int offset) {